#include "main_user.h"

#include "AS5600.h"
#include "Soft_IIC.h"


void DWT_Init(void);


uint32_t start,end,cycles;
float time_us;



void main_user(void)
{
	
     ...
	
	/******* 用户区初始化  **********/
	DWT_Init();    //调试计数器


  //SoftI2C_RegisterAndInit(1000000, SystemCoreClock);
    bsp_as5600Init();

	//校准传感器与电机零点偏移角度
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
		HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
		HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
		HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);

		TIM1->CCR1 = PWM_HalfPerMax * 13/10;  //  A  U   // d轴强拖，形成SVPWM模型中的基础矢量1，即对应转子零度位置
		TIM1->CCR2 = PWM_HalfPerMax;  //  B  V
		TIM1->CCR3 = PWM_HalfPerMax;  //  C  W
		HAL_Delay(200);     
		float angle_zero_offset;

		bsp_as5600GetAngle(&angle_zero_offset);
		Encoder_AS5600.angle_zero_offset = - angle_zero_offset;
		
    //bsp_AS5600_SetZero(1);

    TIM1->CCR1 = PWM_HalfPerMax;  //  A  U   // 松开电机
		TIM1->CCR2 = PWM_HalfPerMax;  //  B  V
		TIM1->CCR3 = PWM_HalfPerMax;  //  C  W

    bsp_as5600Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	uint32_t previousMillis = 0;
  const uint32_t interval = 10; // 单位 ms 间隔

  while (1)
  {
			 // 获取当前的系统时间
			 uint32_t currentMillis = HAL_GetTick();
		
		 // 检查是否已达到间隔时间
		 if (currentMillis - previousMillis >= interval) {
				previousMillis = currentMillis;  // 更新上次执行的时间
			 
			 
        // 调用要定时执行的函数
			 __disable_irq();
				start = DWT->CYCCNT; // 记录起始时间
       
			  bsp_as5600GetAngle(&Encoder_AS5600.angle);
			  //bsp_as5600_DMAGetAngle(&Encoder_AS5600.angle);
				end = DWT->CYCCNT;   // 记录结束时间
				
				cycles  = end - start; // 计算运行的 CPU 周期数
				// 处理溢出情况（如果测量过程中发生了溢出）
				if (end < start) {
						cycles = (0x100000000ULL - start) + end;  // 处理溢出
				} else {
					cycles = end - start;
				}
				time_us  = (float)cycles / (SystemCoreClock / 1e6); // 转换为微秒
				__enable_irq();
		 }
		
  }
}

/**********************  DWT  ************************/
void DWT_Init(void) {
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 使能 DWT
    DWT->CYCCNT = 0; // 计数器清零
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // 使能 CYCCNT 计数器
}

//===========================================================================
// No more.
//===========================================================================
